home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fritz: All Fritz
/
All Fritz.zip
/
All Fritz
/
FILES
/
PROGNG_C
/
CSCRENED.LZH
/
ED4.C
< prev
next >
Wrap
Text File
|
1984-02-04
|
11KB
|
704 lines
/* ED4.C */
#include "ed0.c"
#include "ed1.ccc"
char editbuf[MAXLEN];
char pickbuf[PUTBUFLN]; /* pick buffer */
int picklines, pickend; /* pick buffer parameters */
int editp;
int editpmax;
int edcflag;
edabt()
{
edgetln();
edredraw();
edbegin();
edcflag=NO;
}
edbegin()
{
editp=0;
outxy(0,outyget());
}
ederase() /* new: erase from cursor to end of line */
{
if (editp==editpmax) {
return;
}
edcflag=YES;
editpmax=editp;
edredraw();
}
edhome() /* new: home cursor. subsequent calls alternate */
{ /* cursor to top and bottom of screen */
int ypos;
if (edrepl()!=OK){
return;
}
if ((ypos=outyget())<SCRNL3) {
while((ypos<SCRNL1)&&(!bufnrbot())){
if (bufdn()!=OK){
return(ERR);
}
ypos++;
}
}
else {
while((ypos>1)&&(!bufattop())){
if (bufup()!=OK){
return(ERR);
}
ypos--;
}
}
edgetln();
outxy(edxpos(),ypos);
}
edpick(begin,end) int begin,end; { /* pick marked lines to buffer */
int oldline,oldx,oldy,len,nlines;
if ((begin==(-1))|(end==(-1))|(end<begin)){
sysabort();
return(ERR);
}
oldx=outxget();
oldy=outyget();
if (edrepl()!=OK) {
return(ERR);
}
oldline=bufln();
nlines=end-begin+1;
len=buflength(begin,nlines);
if (len>PUTBUFLN){
pmtmode("Not picked: no room");
sysabort();
return(ERR);
}
pickend=len;
buftopick(pickbuf,begin,nlines);
bufgo(oldline);
edgetln();
editp=edscan(oldx);
outxy(oldx,oldy);
edredraw();
picklines=nlines;
return(OK);
}
edput() { /* put lines in pick buffer into main buffer */
/* before current line */
int k,oldline,oldx,oldy;
if (pickend==0){
return(OK);
}
oldx=outxget();
oldy=outyget();
if (edrepl()!=OK){
return(ERR);
}
oldline=bufln();
if (picktobuf(pickbuf,pickend,picklines)!=OK) {
return(ERR);
}
bufgo(oldline);
if (edatbot()){
;
}
else{
bufout(bufln()+1,oldy+1,SCRNL1-oldy);
}
edgetln();
outxy(0,oldy);
edredraw();
editp=min(oldx,editpmax);
outxy(edxpos(),oldy);
return(OK);
}
edchng(c) char c;
{
char oldc;
int k,kk,n,m,tabpos;
if (editp>=editpmax) {
edins(c);
return;
}
/* experimental code for better treatment of virtual columns */
if (editbuf[editp]==c) {
edright();
return;
}
tabpos=outxget()%tablength();
if ((editbuf[editp]==TAB)&(tabpos!=tablength()-1)) {
edins(c);
return;
}
kk=editp-1;
m=NO;
if ((kk>=0)&(editbuf[kk]==TAB)&(tabpos!=0)) {
editp--;
n=outxget()-edxpos();
if ((n+fmtlen(editbuf,editpmax)+1)<SCRNW1) {
k=editpmax;
while (k>(editp+1)) {
editbuf[k+n-1]=editbuf[k-1];
k--;
}
while (n-- >0) {
editbuf[editp++]=' ';
editpmax++;
}
m=YES;
fmtadj(editbuf,kk,editpmax);
}
}
/* end experimental code */
oldc=editbuf[editp];
editbuf[editp]=c;
fmtadj(editbuf,editp,editpmax);
k=fmtlen(editbuf,editpmax);
if (k>SCRNW1) {
editbuf[editp]=oldc;
fmtadj(editbuf,editp,editpmax);
}
else {
edcflag=YES;
editp++;
if ((c==TAB)|(oldc==TAB)) {
edredraw();
}
else {
fmtchdev(c);
}
}
/* begin experimental code */
if ((m==YES)&(tabpos!=(tablength()-1))) {
k=editpmax;
while (k>editp) {
editbuf[k]=editbuf[k-1];
k--;
}
editbuf[editp]=TAB;
editpmax++;
fmtadj(editbuf,editp,editpmax);
edredraw();
}
/* end experimental code */
}
edldel() /* deletes character before cursor */
/* eddel() in original version: no change in code */
{
int k;
if(edxpos() < outxget()) {
outxy(outxget()-1, outyget());
return;
}
if (editp==0) {
return;
}
edcflag=YES;
k=editp;
while (k<editpmax) {
editbuf[k-1]=editbuf[k];
k++;
}
editp--;
editpmax--;
edredraw();
}
edcdel() /* deletes character at cursor */
{
int k;
if(edxpos() < outxget()) {
outxy(outxget()-1, outyget());
return;
}
edcflag=YES;
if (editp == editpmax) {
if (editp==0) {
return;
}
editp--;
editpmax--;
edredraw();
return;
}
k=editp;
while (k<(editpmax-1)) {
editbuf[k]=editbuf[k+1];
k++;
}
editpmax--;
edredraw();
}
eddn()
{
int oldx;
oldx=outxget();
if (edrepl()!=OK) {
return(ERR);
}
if (bufnrbot()) {
sysabort();
return(OK);
}
if (bufdn()!=OK) {
return(ERR);
}
edgetln();
editp=edscan(oldx);
if (edatbot()) {
edsup(bufln()-SCRNL2);
outxy(oldx,SCRNL1);
}
else {
outxy(oldx,outyget()+1);
}
return(OK);
}
edend()
{
editp=editpmax;
outxy(edxpos(),outyget());
}
edgo(n, p) int n, p;
{
if (edrepl()==ERR) {
return(ERR);
}
if (bufgo(n)==ERR) {
return(ERR);
}
if (bufatbot()) {
if (bufup()==ERR) {
return(ERR);
}
}
bufout(bufln(),1,SCRNL1);
edgetln();
editp=min(p,editpmax);
outxy(edxpos(),1);
return(OK);
}
edins(c) char c;
{
int k,kk,n,l;
if (editpmax>=MAXLEN){
return;
}
if ((editp==editpmax) & (edxpos()<outxget())) {
k=outxget() - edxpos();
editpmax=editpmax+k;
while (k-- > 0) {
editbuf [editp++] = ' ';
}
editp=editpmax;
}
/* experimental code for better treatment of virtual columns */
kk=editp-1;
if ((kk>=0)&(editbuf[kk]==TAB)&((l=outxget()%tablength())!=0)) {
editp--;
n=outxget()-edxpos();
if ((n+fmtlen(editbuf,editpmax)+1)<SCRNW1) {
k=editpmax;
while (k>(editp+1)) {
editbuf[k+n-1]=editbuf[k-1];
k--;
}
while (n-- >0) {
editbuf[editp++]=' ';
editpmax++;
}
editbuf[editp]=c;
editp++;
if (l!=(tablength()-1)) {
k=editpmax;
while (k>editp) {
editbuf[k]=editbuf[k-1];
k--;
}
editbuf[editp]=TAB;
editpmax++;
}
fmtadj(editbuf,kk,editpmax);
edredraw();
return;
}
}
/* end experimental code */
k=editpmax;
while (k>editp) {
editbuf[k]=editbuf[k-1];
k--;
}
editbuf[editp]=c;
editp++;
editpmax++;
fmtadj(editbuf,editp-1,editpmax);
k=fmtlen(editbuf,editpmax);
if (k>SCRNW1) {
edldel();
}
else {
edcflag=YES;
edredraw();
}
}
edjoin()
{
int k;
if (bufattop()) {
return;
}
if (edrepl()!=OK) {
return;
}
if (bufup()!=OK) {
return;
}
k = bufgetln(editbuf,MAXLEN);
if (bufdn()!=OK) {
return;
}
k=k+bufgetln(editbuf+k,MAXLEN-k);
if (k>SCRNW1) {
bufgetln(editbuf,MAXLEN);
return;
}
if (bufup()!=OK) {
return;
}
editpmax=k;
edcflag=YES;
if (edrepl()!=OK) {
return;
}
if (bufdn()!=OK) {
return;
}
if (bufdel()!=OK) {
return;
}
if (bufup()!=OK) {
return;
}
if (edattop()) {
edredraw();
}
else {
k=outyget()-1;
bufout(bufln(),k,SCRNL-k);
outxy(0,k);
edredraw();
}
}
edkill(c) char c;
{
int k,p;
if (editp==editpmax) {
return;
}
edcflag=YES;
k=1;
while ((editp+k)<editpmax) {
if (editbuf[editp+k]==c){
break;
}
else {
k++;
}
}
p=editp+k;
while (p<editpmax) {
editbuf[p-k]=editbuf[p];
p++;
}
editpmax=editpmax-k;
edredraw();
}
edleft()
{
int k;
if (edxpos()<outxget()){
outxy(max(0,outxget()-1),outyget());
}
else if (editp!=0){
editp--;
outxy(edxpos(),outyget());
}
}
ednewdn()
{
int k;
if (bufatbot()){
if (bufins(editbuf,editpmax)!=OK){
return;
}
}
else if (edrepl()!=OK){
return;
}
if (bufdn()!=OK){
return;
}
if (bufins(editbuf,0)!=OK){
return;
}
edgetln();
if (edatbot()){
edsup(bufln()-SCRNL2);
outxy(edxpos(),SCRNL1);
}
else {
k=outyget();
bufout(bufln(),k+1,SCRNL1-k);
outxy(edxpos(),k+1);
}
}
ednewup()
{
int k;
if (edrepl()!=OK) {
return;
}
if (bufins(editbuf,0)!=OK){
return;
}
edgetln();
if (edattop()){
edsdn(bufln());
outxy(edxpos(),1);
}
else {
k=outyget();
bufout(bufln(),k,SCRNL-k);
outxy(edxpos(),k);
}
}
edright() /* right one literal character - tabs move to next tab stop */
{
if (edxpos()<outxget()){
outxy(min(SCRNW1,outxget()+1),outyget());
}
else if (edxpos()>outxget()){
outxy(edxpos(),outyget());
}
else if (editp<editpmax){
editp++;
outxy(edxpos(),outyget());
}
else {
outxy(min(SCRNW1,outxget()+1),outyget());
}
}
edsplit()
{
int p,q;
int k;
edcflag = NO;
if (bufatbot()){
if (bufins(editbuf,editp)!=OK){
return;
}
}
else {
if (bufrepl(editbuf,editp)!=OK){
return;
}
}
p=editpmax;
q=editp;
editpmax=editp;
editp=0;
edredraw();
editp=0;
while (q<p){
editbuf[editp++] = editbuf[q++];
}
editpmax=editp;
editp=0;
if (bufdn()!=OK){
return;
}
if (bufins(editbuf,editpmax)!=OK) {
return;
}
if (edatbot()) {
edsup(bufln()-SCRNL2);
outxy(1,SCRNL1);
edredraw();
}
else {
k=outyget();
bufout(bufln(),k+1,SCRNL1-k);
outxy(1,k+1);
edredraw();
}
}
edsrch(c) char c;
{
if (editp==editpmax){
return;
}
editp++;
while (editp<editpmax) {
if (editbuf[editp]==c) {
break;
}
else {
editp++;
}
}
outxy(edxpos(),outyget());
}
edabsright() /* right one column - one virtual character */
{
int xpos;
xpos=outxget();
if (xpos<SCRNW1) {
outxy(++xpos,outyget());
editp=edscan(xpos);
}
}
edabsleft() /* left one column - one virtual character */
{
int xpos;
xpos=outxget();
if (xpos>0) {
outxy(--xpos,outyget());
editp=edscan(xpos);
}
}
edup()
{
int oldx;
oldx=outxget();
if (edrepl()!=OK) {
return(ERR);
}
if (bufattop()) {
sysabort();
return(OK);
}
if (bufup()!=OK){
return(ERR);
}
edgetln();
editp=edscan(oldx);
if (edattop()) {
edsdn(bufln());
outxy(oldx,1);
}
else {
outxy(oldx,outyget()-1);
}
return(OK);
}
edzap()
{
int k;
if (bufdel()!=OK){
return;
}
if (bufatbot()){
if (bufup()!=OK){
return;
}
edgetln();
if (edattop()) {
edredraw();
}
else {
outdelln();
outxy(0,outyget()-1);
}
return;
}
edgetln();
if (edattop()) {
edsup (bufln());
outxy(0,1);
}
else {
k=outyget();
bufout(bufln(),k,SCRNL-k);
outxy(0,k);
}
}
edatbot()
{
return(outyget()==SCRNL1);
}
edattop()
{
return(outyget()==1);
}
edredraw()
{
fmtadj(editbuf,0,editpmax);
fmtsubs(editbuf,max(0,editp-1),editpmax);
outxy(edxpos(),outyget());
}
edxpos()
{
return(min(SCRNW1,fmtlen(editbuf,editp)));
}
edgetln()
{
int k;
editp=0;
edcflag=NO;
k=bufgetln(editbuf,MAXLEN);
if (k>MAXLEN) {
error("line truncated");
editpmax=MAXLEN;
}
else {
editpmax=k;
}
fmtadj(editbuf,0,editpmax);
}
edrepl()
{
if (edcflag==NO) {
return(OK);
}
edcflag=NO;
if (bufatbot()){
return(bufins(editbuf,editpmax));
}
else {
return(bufrepl(editbuf,editpmax));
}
}
edscan(xpos) int xpos;
{
editp=0;
while (editp<editpmax){
if (fmtlen(editbuf,editp)<xpos){
editp++;
}
else {
break;
}
}
return(editp);
}
edsup(topline) int topline;
{
if (outuphas()==YES){
outsup();
bufout(topline+SCRNL2,SCRNL1,1);
}
else {
bufout(topline,1,SCRNL1);
}
}
edsdn(topline) int topline;
{
if (outdnhas()==YES) {
outsdn();
bufout(topline,1,1);
}
else {
bufout(topline,1,SCRNL1);
}
}